﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace MeTool
{
    /// <summary>
    /// 生成文本的拼音简码
    /// </summary>
    /// <remarks></remarks>
    public static class PinYin
    {
        /// <summary>
        /// 返回文本的拼音简码, 如有包含多音字则返回最靠前的拼音简码
        /// <para>大量集中调用时, 为提高性能, 应制订优化方案</para>
        /// <para>拼音简码的意思, 例: 张艺宽 -> ZYK</para>
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static string GetPinYinSimple(string text)
        {
            string dText = "";
            foreach (char item in text)
            {
                var theStrItem = item;
                foreach (var dPinyin in mPinYinText)
                {
                    if (dPinyin.Contains(theStrItem))
                    {
                        theStrItem = dPinyin[0];
                        break;
                    }
                }
                dText += char.ToUpper(theStrItem).ToString();
            }
            return dText;
        }

        /// <summary>
        /// 返回文本的拼音简码列表,返回的列表中的每一项对应着参数的相应位置的每一个文字. 
        /// <para>大量集中调用时, 为提高性能, 应制订优化方案</para>
        /// <para>如果有多音字,返回的对应项中会包含多个拼音简码.</para>
        /// <para>每一项中至少会有一个拼音简码,此时也表示它对应的文字不是多音字</para>
        /// <para>拼音简码的意思, 例: 张艺宽 -> ZYK</para>
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static List<string> GetPinYinList(string text)
        {
            List<string> dList = new List<string>();
            foreach (char dChar in text)
            {
                dList.Add(GetPinYinFromWord(dChar));
            }
            return dList;
        }

        /// <summary>
        /// 用于返回单个文字的所有拼音简码, 没有找到时返回原字符
        /// <para>返回的字符串至少包含一个字符, 只有多音字才会包含多个字符. 当中的每一个字符都是一个结果</para>
        /// </summary>
        /// <param name="chr"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        private static string GetPinYinFromWord(char chr)
        {
            string dStr = "";
            foreach (string dPinyin in mPinYinText)
            {
                if (!dStr.Contains(dPinyin[0]) && dPinyin.Contains(chr))
                {
                    dStr += dPinyin[0].ToString();
                }
            }
            if (dStr.Length == 0) dStr = chr.ToString();
            return dStr.ToUpper();
        }

        private static readonly string[] mPinYinText = Properties.Resources.py.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
    }
}
